package com.sxkj.service.sys;

import cn.hutool.core.util.IdUtil;
import com.github.pagehelper.PageHelper;
import com.sxkj.common.utils.IdUtils;
import com.sxkj.common.utils.StringUtils;
import com.sxkj.entity.entity.sys.Menu;
import com.sxkj.entity.mapper.sys.MenuMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 *
 * @title: SysMenuService
 * @author: daixiaowei
 * @date: 2019年12月10日 下午 01:24:03
 * @description: 权限接口
 */
@Service
public class MenuService {
    @Autowired
    private MenuMapper menuMapper;

    /**
     *
     * @title: getPermissionList
     * @author: daixiaowei
     * @date: 2019年12月10日 下午 01:45:29
     * @description: 查询权限（待优化）
     * @param: userId
     * @return:
     */
    public List<Menu> getPermissionList(String userId) {
        return menuMapper.getPermissionList(userId);
    }


    /**
     *
     * @title: formatMenuTree
     * @author: daixiaowei
     * @date: 2019年12月17日 下午 01:09:27
     * @description: 返回所需要个事的MenuTree
     * @param: menuList
     * @return:
     */
    public List<Map<String,Object>> formatMenuTreeList(List<Menu> menuList) {
        List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();
        Map<String, Menu> menuMap = menuList.stream().collect(Collectors.toMap(Menu::getId, menu -> menu));
        for (Menu m : menuList) {
            if (StringUtils.isNotBlank(m.getParentId()) && null == menuMap.get(m.getParentId())) {
                Menu menu = menuMapper.selectByPrimaryKey(m.getParentId());
                menuMap.put(menu.getId(), menu);
            }
        }
        menuList = new ArrayList<>(menuMap.values());
        for (Menu m : menuList) {
            Map<String, Object> map = new HashMap<String, Object>();
            if (m.getParentId() == null || "".equals(m.getParentId()) || null == menuMap.get(m.getParentId())) {
                map.put("id", m.getId());
                map.put("parentId", m.getParentId());
                map.put("parentIds", m.getParentIds());
                map.put("name", m.getName());
                map.put("href", m.getHref());
                map.put("path", m.getPath());
                map.put("aliasName", m.getAliasName());
                map.put("disabledAttr", m.getDisabled() == true ? "是" : "否");
                map.put("isShow", m.getIsShow() == true ? "是" : "否");
                map.put("location", m.getLocation());
                map.put("hasChild", m.getHasChildren());
                map.put("icon", m.getIcon());
                if (m.getHasChildren() == true) {
                    map.put("children", menuChilds(m.getId(), menuList));
                }
                resultList.add(map);
            }
        }
        return resultList.stream().sorted(MenuService :: comparingByLocation).collect(Collectors.toList());
    }

    /**
     *
     * @title: formatMenuTree
     * @author: daixiaowei
     * @date: 2019年12月24日 下午 01:58:08
     * @description: 格式化菜单树
     * @param:
     * @return:
     */
    public List<Map<String,Object>> formatMenuTree() {
        List<Map<String,Object>> list= new ArrayList<Map<String,Object>>();
        List<Menu> menus = menuMapper.selectMenuList();
        if(menus!=null){
            for(Menu m:menus){
                Map<String,Object> map = new HashMap<String, Object>();
                if(m.getParentId()==null || "".equals(m.getParentId())){
                    map.put("id", m.getId());
                    map.put("parentId", m.getParentId());
                    map.put("parentIds", m.getParentIds());
                    map.put("name",m.getName() + "-" + m.getAliasName());
                    map.put("href",m.getHref());
                    map.put("path",m.getPath());
                    map.put("aliasName", m.getAliasName());
                    map.put("disabledAttr", m.getDisabled()==true?"是":"否");
                    map.put("isShow", m.getIsShow()==true?"是":"否");
                    map.put("location", m.getLocation());
                    if(m.getHasChildren()==true){
                        map.put("children",menuChildSearch(m.getId()));
                    }
                    list.add(map);
                }
            }
        }
        return list;
    }



    /**
     *
     * @title: menuChilds
     * @author: daixiaowei
     * @date: 2019年12月17日 下午 01:10:02
     * @description: 返回child tree
     * @param: menus
     * @return:
     */
    private List<Map<String, Object>> menuChilds(String id,List<Menu> menus){
        List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>();
        for(Menu m:menus){
            Map<String,Object> childMap = new HashMap<String, Object>();
            if(m.getParentId()!=null && m.getParentId().equals(id)){
                childMap.put("id", m.getId());
                childMap.put("parentId", m.getParentId());
                childMap.put("parentIds", m.getParentIds());
                childMap.put("name",m.getName());
                childMap.put("href",m.getHref());
                childMap.put("path",m.getPath());
                childMap.put("aliasName", m.getAliasName());
                childMap.put("disabledAttr", m.getDisabled()==true?"是":"否");
                childMap.put("isShow", m.getIsShow()==true?"是":"否");
                childMap.put("hasChild", m.getHasChildren());
                childMap.put("icon", m.getIcon());
                if(m.getHasChildren()==true){
                    childMap.put("children",menuChilds(m.getId(),menus));
                }
                childMap.put("location", m.getLocation());
                lists.add(childMap);
            }
        }
        return lists.stream().sorted(MenuService :: comparingByLocation).collect(Collectors.toList());
    }

    /**
     *
     * @title: comparingByLocation
     * @author: daixiaowei
     * @date: 2019年12月17日 下午 01:11:11
     * @description: 比较
     * @param:
     * @return:
     */
    private static int comparingByLocation(Map<String, Object> map1, Map<String, Object> map2) {
        if(null != map1.get("location") && null != map2.get("location")){
            return (int) map1.get("location") - (int)map2.get("location");
        }else{
            return 0;
        }
    }

    /**
     *
     * @title: searchListPage
     * @author: daixiaowei
     * @date: 2019年12月17日 下午 03:25:34
     * @description: 菜单列表查询
     * @param:
     * @return:
     */
    public List<Map<String,Object>> searchListPage(Integer pageSize, Integer pageNum) {
        List<Map<String,Object>> list= new ArrayList<Map<String,Object>>();
        PageHelper.startPage(pageNum, pageSize);
        List<Menu> menus = menuMapper.selectMenuList();
        if(menus!=null){
            for(Menu m:menus){
                Map<String,Object> map = new HashMap<String, Object>();
                if(m.getParentId()==null || "".equals(m.getParentId())){
                    map.put("id", m.getId());
                    map.put("parentId", m.getParentId());
                    map.put("parentIds", m.getParentIds());
                    map.put("name",m.getName() + "-" + m.getAliasName());
                    map.put("href",m.getHref());
                    map.put("path",m.getPath());
                    map.put("aliasName", m.getAliasName());
                    map.put("disabledAttr", m.getDisabled()==true?"是":"否");
                    map.put("isShow", m.getIsShow()==true?"是":"否");
                    map.put("location", m.getLocation());
                    if(m.getHasChildren()==true){
                        map.put("children",menuChildSearch(m.getId()));
                    }
                    list.add(map);
                }
            }
        }
        return list;
    }
    private List<Menu> menuChildSearch(String id) {
        return menuMapper.selectMenuChildList(id);
    }

    /**
     *
     * @title: add
     * @author: daixiaowei
     * @date: 2019年12月18日 下午 03:18:11
     * @description: 新增方法
     * @param: menu
     * @return:
     */
    public void add(Menu menu) {
        if (StringUtils.isNotEmpty(menu.getParentId())) {
            Menu menuParent = menuMapper.selectByPrimaryKey(menu.getParentId());
            menuParent.setHasChildren(true);
            menuMapper.updateByPrimaryKey(menuParent);
        }
        menu.preInsert();
        menu.setHasChildren(false);
        menuMapper.insert(menu);
    }

    /**
     *
     * @title: update
     * @author: daixiaowei
     * @date: 2019年12月18日 下午 04:56:40
     * @description: 菜单修改
     * @param: menu
     * @return:
     */
    public void update(Menu menu) {
        menu.preUpdate();
        menu.setIsDel(0);
        menuMapper.updateByPrimaryKey(menu);
    }

    /**
     *
     * @title: searchMenuById
     * @author: daixiaowei
     * @date: 2019年12月18日 下午 05:18:22
     * @description: 通过id查询Menu对象
     * @param: id
     * @return:
     */
    public Menu searchMenuById(String id) {
        return menuMapper.selectByPrimaryKey(id);
    }

    /**
     *
     * @title: deleteMenuById
     * @author: daixiaowei
     * @date: 2019年12月19日 上午 09:40:47
     * @description: 菜单删除
     * @param: id
     * @return:
     */
    public int deleteMenuById(String id) {
        return menuMapper.deleteByPrimaryKey(id);
    }

    /**
     *
     * @title: reloadMenuTree
     * @author: daixiaowei
     * @date: 2019年12月24日 上午 11:53:24
     * @description: 重新加载MenuTree
     * @param:
     * @return:
     */
    public Map<String, Object> reloadMenuTree() {
        UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        Map<String, Object> map = new HashMap<>();
        map.put("menuTreeList", formatMenuTreeList(menuMapper.getPermissionList(((AdminUserDetails) userDetails).user.getId())));
        map.put("menuTree",formatMenuTree());
        return map;
    }
}
